

#include "main.h"





/********************************************************
**函数名：	
**功能：	  
**输入：
**输出：	
**注意：		
*********************************************************/
void BSW_ADC_Config(BSW_ADC_Cfg  ADC_Cfg)
{	
//	/********************通道选择-切换**********************/
//	SIM->CHIPCTL |= ADC_Cfg.SIM_Ch_Select;                                                 	/* SIM 模块 用来控制PTB0/1/13/14四个引脚ADC通道复用            */ 

	PCC_SetClockMode(PCC, ADC_Cfg.clockName, false);                                        /* 为给定的外设启用/禁用时钟                                   */
	PCC_SetPeripheralClockControl(PCC, ADC_Cfg.clockName, true, ADC_Cfg.u32_ClkSoc, 0, 0); 	/* 设置SOSC控制寄存器                                          */
	PCC_SetClockMode(PCC, ADC_Cfg.clockName, true);                                         /* 为给定的外设启用/禁用时钟                                   */
//	 
//	ADC_SetInputChannel(ADC_Cfg.Adc_base,ADC_Cfg.u8_ChIndex,ADC_Cfg.InputCh);             	/* 此函数配置测量通道的输入通道，在软件触发模式下，配置通道A（索引0）将立即开始新的转换 */
//	ADC_SetClockDivide(ADC_Cfg.Adc_base,ADC_Cfg.clockDivide);                             	/* 配置ADC时钟分频器                                           */
//	ADC_SetResolution(ADC_Cfg.Adc_base,ADC_Cfg.resolution);                               	/* 分辨率模式配置                                              */
//	ADC_SetInputClock(ADC_Cfg.Adc_base,ADC_Cfg.inputClock);                               	/* ADC的时钟输入源                                             */
//	ADC_SetSampleTime(ADC_Cfg.Adc_base,ADC_Cfg.u8_sampletime);                            	/* 设置AD时钟周期中的示例时间                                  */
//	ADC_SetTriggerMode(ADC_Cfg.Adc_base,ADC_Cfg.trigger);                                  	/* ADC触发模式                                                 */
//	ADC_SetPretriggerSelect(ADC_Cfg.u32_instance,ADC_Cfg.pretriggerSel);                   	/* ADC预触发器选择                                             */
//	ADC_SetDMAEnableFlag(ADC_Cfg.Adc_base,ADC_Cfg.b_DMAEnFlag);                            	/* DMA启用标志                                                 */
//	ADC_SetVoltageReference(ADC_Cfg.Adc_base,ADC_Cfg.voltageRef);                          	/* ADC基准电压选择                                             */
//	ADC_SetContinuousConvFlag(ADC_Cfg.Adc_base,ADC_Cfg.b_ConvFlag);                       	/* 连续转换标志状态                                            */
//	ADC_SetSupplyMonitoringEnableFlag(ADC_Cfg.Sim_baseAddr,ADC_Cfg.b_SupMonEnFlag);        	/* 电源监视器启动标志                                          */
//	/* start calibration */
//	ADC_SetCalibrationActiveFlag(ADC_Cfg.Adc_base, ADC_Cfg.b_CalActFlag);                 	/* 校准启动标志状态                                            */
//	while (ADC_GetCalibrationActiveFlag(ADC_Cfg.Adc_base));                               	/* 等待校准完成                                                */
//	ADC_SetUserOffsetValue(ADC_Cfg.Adc_base,ADC_Cfg.u16_value_Offset);											/*设置ADC偏移量 - 用于单片机底层基准校准*/
//	ADC_SetHwAverageMode(ADC_Cfg.Adc_base, ADC_Cfg.AvrgMdl);                               	/* 设置硬件平均模式                                            */
//	ADC_SetHwAverageEnableFlag(ADC_Cfg.Adc_base, ADC_Cfg.b_HwAveEnFlag);
//	INT_SYS_EnableIRQ(ADC_Cfg.Adc_IRQn);                             																	/* enable ADC0 interrupt */
//	ADC_SetChanInterruptEnableFlag(ADC_Cfg.Adc_base, ADC_Cfg.u8_ChIndex, ADC_Cfg.Irq_En);
	
//  PCC->PCCn[PCC_ADC1_INDEX] &=~ PCC_PCCn_CGC_MASK;  /* Disable clock to change PCS */
//  PCC->PCCn[PCC_ADC1_INDEX] |= PCC_PCCn_PCS(6);     /* PCS=1: Select SOSCDIV2 */
//  PCC->PCCn[PCC_ADC1_INDEX] |= PCC_PCCn_CGC_MASK;   /* Enable bus clock in ADC */

  ADC_Cfg.Adc_base->SC1[0] =0x00001F;         /* ADCH=1F: Module is disabled for conversions*/
                                  /* AIEN=0: Interrupts are disabled */
  ADC_Cfg.Adc_base->CFG1 = 0x000000004;       /* ADICLK=0: Input clk=ALTCLK1=SOSCDIV2 */
                                  /* ADIV=0: Prescaler=1 */
                                  /* MODE=1: 12-bit conversion */
  ADC_Cfg.Adc_base->CFG2 = 0x00000000C;       /* SMPLTS=12(default): sample time is 13 ADC clks */
  ADC_Cfg.Adc_base->SC2 = 0x00000000;         /* ADTRG=0: SW trigger */
                                  /* ACFE,ACFGT,ACREN=0: Compare func disabled */
                                  /* DMAEN=0: DMA disabled */
                                  /* REFSEL=0: Voltage reference pins= VREFH, VREEFL */
  ADC_Cfg.Adc_base->SC3 = 0x00000000;         /* CAL=0: Do not start calibration sequence */
                                  /* ADCO=0: One conversion performed */
                                  /* AVGE,AVGS=0: HW average function disabled */
}

/********************************************************
**函数名：	BSW_ADC_Uninitialize
**功能：		关闭ADC
**输入：无
**输出：	无
**注意：		
*********************************************************/
void BSW_ADC_Uninitialize (BSW_ADC_Cfg  ADC_Cfg) 
{                                 
	PCC_SetPeripheralClockControl(PCC, ADC0_CLK, true, ADC_Cfg.u32_ClkSoc, 0, 0);                      /* 设置SOSC控制寄存器                                          */
	PCC_SetClockMode(PCC,ADC_Cfg.clockName, false);																													/* 为给定的外设启动/禁止时钟                                   */
}


void convertAdcChan(ADC_Type*  base,u16 adcChan) 
{  
  base->SC1[0]&=~ADC_SC1_ADCH_MASK;	     
  base->SC1[0] = ADC_SC1_ADCH(adcChan);
}

uint8_t adc_complete(ADC_Type*  base)  
{
  return ((base->SC1[0] & ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT); /* Wait for completion */
}

uint32_t read_adc_chx(ADC_Type*  base)  
{
  uint16_t adc_result=0;
  adc_result=base->R[0];      /* For SW trigger mode, R[0] is used */
  return  (uint32_t) (adc_result & 0xFFF); /* Convert result to mv for 0-5V range */
}


/********************************************************
**函数名：	BSW_ADC_StartConversion
**功能：		ADC启动转换
**输入：ADC_instance ADC转换源,ADC_CH ADC转换通道号
**输出：	无
**注意：		
*********************************************************/
void BSW_ADC_StartConversion(BSW_ADC_Cfg  ADC_Cfg)
{
//	SIM->CHIPCTL |= ADC_Cfg.SIM_Ch_Select;  
//	ADC_SetChanInterruptEnableFlag(ADC_Cfg.Adc_base, 0, false);
//	ADC_SetInputChannel(ADC_Cfg.Adc_base, 0, ADC_Cfg.InputCh);
	
	convertAdcChan(ADC_Cfg.Adc_base,ADC_Cfg.InputCh);
}


/********************************************************
**函数名：	BSW_ADC_GetValue
**功能：		获取ADC转换结果
**输入：	ADC_instance ADC转换源,ADC_CH ADC转换通道号
**输出：	转换结果(失败返回-1)
**注意：		
*********************************************************/
u16	BSW_ADC_GetValue(BSW_ADC_Cfg  ADC_Cfg)
{	
	u16 ADC_reg = 0;
//	ADC_DRV_WaitConvDone(ADC_Cfg.u32_instance);
//	ADC_DRV_GetChanResult(ADC_Cfg.u32_instance,0,&ADC_reg);
  while(adc_complete(ADC_Cfg.Adc_base)==0);
	ADC_reg = (u16)read_adc_chx(ADC_Cfg.Adc_base);
  return ADC_reg;
}






/********************************************************
**函数名：	BSW_ADC_StartCov
**功能：		ADC启动转换
**输入：ADC_instance ADC转换源,ADC_CH ADC转换通道号
**输出：	无
**注意：		
*********************************************************/
void BSW_ADC_StartCov(Bsw_Adc_CovFlg Adc_CovFlg)
{
//	SIM->CHIPCTL |= Adc_CovFlg.SIM_Ch_Select; 
	ADC_SetChanInterruptEnableFlag(Adc_CovFlg.Adc_base, 0, true);
	ADC_SetInputChannel(Adc_CovFlg.Adc_base, 0, Adc_CovFlg.InputCh);
//	Adc_CovFlg.Adc_base->aSC1[0] &= ~(ADC_SC1_ADCH_MASK);
//  Adc_CovFlg.Adc_base->aSC1[0]  |= (ADC_SC1_ADCH(Adc_CovFlg.InputCh) | 0x40);

//	ADC_SetInputChannel(Adc_CovFlg.Adc_base, 0, Adc_CovFlg.InputCh);
}

/********************************************************
**函数名：	
**功能：	  
**输入：
**输出：	
**注意：		
*********************************************************/
void ADC0_IRQHandler(void) 
{
	/*清除中断标志*/
	ECU_ADC0_IRQ();
	/*读取结果*/
}


/********************************************************
**函数名：	
**功能：	  
**输入：
**输出：	
**注意：		
*********************************************************/
void ADC1_IRQHandler(void) 
{
	/*清除中断标志*/
	ECU_ADC1_IRQ();
	/*读取结果*/
}





